package com.hotel.common.example;

import com.hotel.common.utils.DBTools;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

/**
 * 数据库使用示例
 * 展示如何在各个微服务中使用DBTools
 */
@Component
public class DatabaseUsageExample {
    
    /**
     * 示例：在用户服务中查询用户信息（使用主数据库）
     */
    public List<Map<String, String>> getUserInfo(String userId) {
        // 方法1：使用默认数据源（根据配置自动选择）
        return DBTools.query("SELECT * FROM users WHERE id = ?", userId);
        
        // 方法2：明确指定使用主数据库
        // return DBTools.queryWithPrimary("SELECT * FROM users WHERE id = ?", userId);
    }
    
    /**
     * 示例：在业务服务中查询酒店信息（使用业务数据库）
     */
    public List<Map<String, String>> getHotelInfo(String hotelId) {
        // 方法1：使用默认数据源（根据配置自动选择）
        return DBTools.query("SELECT * FROM hotels WHERE id = ?", hotelId);
        
        // 方法2：明确指定使用业务数据库
        // return DBTools.queryWithBusiness("SELECT * FROM hotels WHERE id = ?", hotelId);
    }
    
    /**
     * 示例：跨数据库查询
     */
    public Map<String, Object> getCrossDatabaseInfo(String userId, String hotelId) {
        // 查询用户信息（主数据库）
        List<Map<String, String>> userInfo = DBTools.queryWithPrimary(
            "SELECT id, username, email FROM users WHERE id = ?", userId);
        
        // 查询酒店信息（业务数据库）
        List<Map<String, String>> hotelInfo = DBTools.queryWithBusiness(
            "SELECT id, name, address FROM hotels WHERE id = ?", hotelId);
        
        return Map.of(
            "user", userInfo.isEmpty() ? null : userInfo.get(0),
            "hotel", hotelInfo.isEmpty() ? null : hotelInfo.get(0)
        );
    }
    
    /**
     * 示例：事务操作
     */
    public boolean updateUserAndHotel(String userId, String hotelId, String newEmail, String newAddress) {
        try {
            // 更新用户信息（主数据库）
            int userUpdated = DBTools.updateWithPrimary(
                "UPDATE users SET email = ? WHERE id = ?", newEmail, userId);
            
            // 更新酒店信息（业务数据库）
            int hotelUpdated = DBTools.updateWithBusiness(
                "UPDATE hotels SET address = ? WHERE id = ?", newAddress, hotelId);
            
            return userUpdated > 0 && hotelUpdated > 0;
        } catch (Exception e) {
            // 这里可以添加回滚逻辑
            System.err.println("更新失败: " + e.getMessage());
            return false;
        }
    }
    
    /**
     * 示例：批量操作
     */
    public int[] batchInsertUsers(List<Object[]> userData) {
        // 使用主数据库进行批量插入
        return DBTools.batchUpdate(
            "INSERT INTO users (username, email, password) VALUES (?, ?, ?)", 
            userData);
    }
    
    /**
     * 示例：统计查询
     */
    public Map<String, Integer> getStatistics() {
        // 用户统计（主数据库）
        int userCount = DBTools.count("SELECT * FROM users");
        
        // 酒店统计（业务数据库）
        int hotelCount = DBTools.count("SELECT * FROM hotels");
        
        return Map.of(
            "userCount", userCount,
            "hotelCount", hotelCount
        );
    }
}
